package com.mastercard.assets.web.forms.process;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.flows.FlowUtil;
import com.mastercard.assets.flows.process.FlowProcessContext;
import com.mastercard.assets.flows.process.FlowProcessInit;
import com.mastercard.assets.flows.process.FlowProcessPost;
import com.mastercard.assets.flows.process.FlowProcessPrevious;
import com.mastercard.assets.flows.process.FlowProcessResult;
import com.mastercard.assets.flows.to.FlowCampaignTO;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblFlujo;
import com.mastercard.assets.jpa.TblForma;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblPreimplementacion;
import com.mastercard.assets.jpa.TblTarea;
import com.mastercard.assets.jpa.TblTareaPreimplementacion;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.FlowProcessForm;

public class PreimplementationEntregaBoletosFormProcess
        implements
		FlowProcessInit , 
		FlowProcessPrevious , 
		FlowProcessPost
{
    
    public FlowProcessResult loadFormData( FlowProcessContext ctx )
		throws
			MasterCardException
	{
		TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
		TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ) ;
		
		TblPreimplementacion tblPreimplementacion = tblTareaPreimplementacion.getTblPreimplementacion( ) ;
		
		TblFlujo tblFlujo = tblPreimplementacion.getTblFlujo( ) ;
                
                TblAsset asset = tblTareaPreimplementacion.getTblAsset( ) ;
                
                List< TblPaquete > packDelAsset = new ArrayList< TblPaquete >( ) ;
                List< TblPaquete > packs =  campania.getTblPaquetes( ) ;
                
                for ( TblPaquete p : packs )
                {
                    if ( p.getTblAsset( ).getCveAsset( ) == asset.getCveAsset() )
                    packDelAsset.add( p ) ;
                    
                }
		
		FlowCampaignTO to = new FlowCampaignTO( ) ;
		
		to.setCveFlow( tblFlujo.getCveFlujo( ) ) ;
		to.setFlow( tblFlujo ) ;
		to.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
		to.setCampania( campania ) ;
                to.setPaquetes( packDelAsset ) ;
		
		
		
		int cveFlujo = tblFlujo.getCveFlujo( ) ;
		int cvePreimplementacion = tblPreimplementacion.getCvePreimplementacion( ) ;
		int cveTareaPreimplementacion = tblTareaPreimplementacion.getCveTareaPreimplementacion( ) ;
		int cveAsset = asset.getCveAsset( ) ;
		
		// esta es la segunda tarea del flujo, y siendo que la primera tarea del flujo solo tiene una salida, y que 
		// este flujo se ejecuta siempre con el mismo asset, entonces busca el registro de TblTareaPreimplementacion
		// con la primer tarea, el asset del registro TblTareaPreimplementacion propio y el flujo propio y que ya se
		// encuentre ejecutado.
//		TblTarea firstWork = MasterCardDAO.getFirstWorkInFlow( cveFlujo ) ;
//		
//		int cveFirstWork = firstWork.getCveTarea( ) ;
//		
//		// busca la tareapreimplementacion de acuerdo a sus datos
//		List< TblTareaPreimplementacion > tblTareaPreimplementacionAnteriores = MasterCardDAO.findTareaPreimplementacionByPreimplementacionAndTareaAndAssetAndExecutedAndStatusAndAllActive( 
//								cvePreimplementacion , 
//								cveAsset , 
//								cveFirstWork , 
//								1 ) ;
//		
//		TblTareaPreimplementacion tblTareaPreimplementacionInicial = null ;
//		
//		System.out.println( "PreimplementationAutorizaMaterialesFormProcess.java: tblTareaPreimplementacionAnteriores/" + tblTareaPreimplementacionAnteriores.size( ) ) ;
//		
//		// en caso de que haya varias, toma la ultim, con la que se creo la tblejecucionmateriales
//		if( tblTareaPreimplementacionAnteriores != null && tblTareaPreimplementacionAnteriores.size( ) > 0 )
//			tblTareaPreimplementacionInicial = tblTareaPreimplementacionAnteriores.get( tblTareaPreimplementacionAnteriores.size( ) - 1 ) ;
//		
//		System.out.println( "PreimplementationAutorizaMaterialesFormProcess.java: tblTareaPreimplementacionInicial/" + tblTareaPreimplementacionInicial.getCveTareaPreimplementacion( ) ) ;
//		
//		// cotizacion relacionada con la tareaPreimplementacion
//		TblEjecucionMaterial ejecucion = null ;
//		
//		// en caso de que sea diferente de null
//		if( tblTareaPreimplementacionInicial != null )
//		{
//			// toma todos los servicios relacionados con la tarea
//			List< TblEjecucionMaterial > tblEjecucionMaterials = tblTareaPreimplementacionInicial.getTblEjecucionMaterials( ) ;
//			
//			// deberia haber solamente una cotizacion por tareaPreimplementacion
//			// en caso de que haya cotizaciones...
//			if( tblEjecucionMaterials != null && tblEjecucionMaterials.size( ) > 0 )
//				// toma el primero
//				ejecucion = tblEjecucionMaterials.get( 0 ) ;
//			
//			to.setEjecucion( ejecucion ) ;
//			
//			// levanta los archivos
//			List< TblEjecucionMaterialArchivo > ejecucionMateriales = ejecucion.getTblEjecucionMaterialArchivos( ) ;
//			
//			TblEjecucionMaterialArchivo[ ] ejecucionMaterialesArr = new TblEjecucionMaterialArchivo[ ejecucionMateriales.size( ) ] ;
//			ejecucionMaterialesArr = ejecucionMateriales.toArray( ejecucionMaterialesArr ) ;
//			
//			// ordena
//			Arrays.sort( ejecucionMaterialesArr , new Comparator< TblEjecucionMaterialArchivo >( )
//					{
//						public int compare( TblEjecucionMaterialArchivo obj1 , TblEjecucionMaterialArchivo obj2 )
//						{
//							return obj1.getArchivoEnviado( ).compareTo( obj2.getArchivoEnviado( ) ) ;
//						}
//					} 
//				) ;
//			
//			ejecucionMateriales = new ArrayList< TblEjecucionMaterialArchivo >( ) ;
//			for( TblEjecucionMaterialArchivo ar : ejecucionMaterialesArr )
//				ejecucionMateriales.add( ar ) ;
//			
//			to.setEjecucionMateriales( ejecucionMateriales ) ;
//		}
		
		// extrae la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
		
		// extrae la forma
		TblForma forma = tarea.getTblForma( ) ;
		
		// nombre del jsp
		String jspName = forma.getArchivoForma( ) ;
		// ruta completa del jsp
		URL ruta = null ;
		try
		{
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			ruta = new URL( "file" , "localhost" , MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + ruta ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_OBTAINING_PATH , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorCalculatingPath" , e.getMessage( ) ) , e ) ;
		}
		
//		String jspPath = ruta.getQuery( ) ;
		String jspPath = "/WEB-INF/formas/" + jspName ;
		
		System.out.println( "FlowUtil.java: jspPath/" + jspPath ) ;
		
		java.util.List< TblAsset > assets = new ArrayList< TblAsset >( ) ;
		java.util.List< TblAsset > assetsDelFlujo = tblPreimplementacion.getTblAssets( ) ;
		
		// recorre assets
		for( TblAsset asset1 : assetsDelFlujo )
			// en caso de que este activo
			if( asset1.getStatus( ) == 1 )
				assets.add( asset1 ) ;
		
		// coloca en el to
		to.setAssets( assets ) ;
		
		// abre el archivo
		File dir = new File( MCUtil.getFormsDir( ) ) ;
//		System.out.println( "***********" + dir.getAbsolutePath( ) ) ;
		File f = new File( dir , jspName ) ;
//		System.out.println( "***********" + f.getAbsolutePath( ) ) ;
		
//		System.getProperties( ).list( System.out ) ;
		
		String fileCode = "" ;
		StringBuffer sb = new StringBuffer( ) ;
		
		try
		{
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/" ) ;
			BufferedReader rIn = new BufferedReader( new FileReader( f ) ) ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/1" ) ;
			String line = "" ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/2" ) ;
			while( ( line = rIn.readLine( ) ) != null )
				sb.append( line ) ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/3" ) ;
			rIn.close( ) ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/4" ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_NO_FORM_FILE_EXIST , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFormFileExist" , jspName ) , e ) ;
		}
		
		System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/5" ) ;
//		System.out.println( sb.toString( ) ) ;
		
		// coloca la ruta del jsp
		to.setJspPath( jspPath ) ;
		to.setJspCode( sb.toString( ) ) ;
		
		sb.setLength( 0 ) ;
		sb = null ;
		
		System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: to/" + to ) ;
		System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: to.getError/" + to.getError( ) ) ;
			
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY , to ) ;
	}
	
	public FlowProcessResult canDisplay( FlowProcessContext ctx )
	{
		TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
		// en caso de uqe ya este ejecutado
		if( tblTareaPreimplementacion.getEjecutado( ) == 1 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_EXECUTED ) ;
		
		// toma las clases para procesar la forma antes de desplegarla
		// toma la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
		
		String nombreTarea = tarea.getNombre( ) ;
		
		// en caso de que la tarea haya sido desactivada
		if( tarea.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_DESACTIVATED ) ;
		
		// toma la forma a la que esta ligada la tarea
		TblForma forma = tarea.getTblForma( ) ;
		
		// en caso de que la forma este desactivada
		if( forma.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_FORM_DESACTIVATED ) ;
		
		/// se pueden agregar mas filtros
		
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY ) ;
	}
	
	public FlowProcessResult processExit( FlowProcessContext ctx )
		throws
			MasterCardException
	{
		TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
		//TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ) ;
		
		//TblPreimplementacion tblPreimplementacion = tblTareaPreimplementacion.getTblPreimplementacion( ) ;
		
		//TblFlujo tblFlujo = tblPreimplementacion.getTblFlujo( ) ;
		
		TblAsset asset = tblTareaPreimplementacion.getTblAsset( ) ;
		
		//int cveFlujo = tblFlujo.getCveFlujo( ) ;
		//int cvePreimplementacion = tblPreimplementacion.getCvePreimplementacion( ) ;
		int cveTareaPreimplementacion = tblTareaPreimplementacion.getCveTareaPreimplementacion( ) ;
		int cveAsset = asset.getCveAsset( ) ;
		
		// esta es la segunda tarea del flujo, y siendo que la primera tarea del flujo solo tiene una salida, y que 
		// este flujo se ejecuta siempre con el mismo asset, entonces busca el registro de TblTareaPreimplementacion
		// con la primer tarea, el asset del registro TblTareaPreimplementacion propio y el flujo propio y que ya se
		// encuentre ejecutado.
		//TblTarea firstWork = MasterCardDAO.getFirstWorkInFlow( cveFlujo ) ;
		
//		int cveFirstWork = firstWork.getCveTarea( ) ;
		
		// busca la tareapreimplementacion de acuerdo a sus datos
//		List< TblTareaPreimplementacion > tblTareaPreimplementacionAnteriores = MasterCardDAO.findTareaPreimplementacionByPreimplementacionAndTareaAndAssetAndExecutedAndStatusAndAllActive( 
//								cvePreimplementacion , 
//								cveAsset , 
//								cveFirstWork , 
//								1 ) ;
		
//		TblTareaPreimplementacion tblTareaPreimplementacionInicial = null ;
		
//		System.out.println( "PreimplementationAutorizaMaterialesFormProcess.java: tblTareaPreimplementacionAnteriores/" + tblTareaPreimplementacionAnteriores.size( ) ) ;
		
		// en caso de que haya varias, toma la ultim, con la que se creo la tblejecucionmateriales
//		if( tblTareaPreimplementacionAnteriores != null && tblTareaPreimplementacionAnteriores.size( ) > 0 )
//			tblTareaPreimplementacionInicial = tblTareaPreimplementacionAnteriores.get( tblTareaPreimplementacionAnteriores.size( ) - 1 ) ;
//		
//		System.out.println( "PreimplementationAutorizaMaterialesFormProcess.java: tblTareaPreimplementacionInicial/" + tblTareaPreimplementacionInicial.getCveTareaPreimplementacion( ) ) ;
//		
//		// cotizacion relacionada con la tareaPreimplementacion
//		TblEjecucionMaterial ejecucion = null ;
//		
//		// en caso de que sea diferente de null
//		if( tblTareaPreimplementacionInicial != null )
//		{
//			// toma todos los servicios relacionados con la tarea
//			List< TblEjecucionMaterial > tblEjecucionMaterials = tblTareaPreimplementacionInicial.getTblEjecucionMaterials( ) ;
//			
//			// deberia haber solamente una cotizacion por tareaPreimplementacion
//			// en caso de que haya cotizaciones...
//			if( tblEjecucionMaterials != null && tblEjecucionMaterials.size( ) > 0 )
//				// toma el primero
//				ejecucion = tblEjecucionMaterials.get( 0 ) ;
//		}
		
		int stepupResult = -1 ;
		
		// procesa los datos
		// los guarda en BD
		try
		{
			FlowProcessForm forma = ( FlowProcessForm ) ctx.getUser( ).getAttribute( "FlowProcessForma" ) ;
			
			String exit = forma.getExit( ) ;
			
			HttpServletRequest request = ctx.getRequest( ) ;
			
			String comentarios = request.getParameter( "comentarios" ) ;
			String cveEjecucionString = request.getParameter( "cveEjecucion" ) ;
			
			// intenta convertir a int
			int cveEjecucion = -1 ;
			try
			{
				cveEjecucion = Integer.parseInt( cveEjecucionString ) ;
			}catch( Exception e )
			{
				
			}
			
			StringBuffer sb = new StringBuffer( ) ;
			
			if( comentarios == null )
				comentarios = "" ;
//			
//			FormFile archivo01 = forma.getArchivo01( ) ;
//			
//			// en caso de null
//			if( archivo01 == null || archivo01.getFileName( ).trim( ).length( ) == 0 )
//				return new FlowProcessResult( 
//						FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_RELOAD , 
//						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.NoWinnerFile" ) , null ) ;
			
			try
			{
				stepupResult = MasterCardDAO.processCampaignFlowSreen3( ctx.getUser( ) , ctx.getTblTareaPreimplementacion( ) , ctx.getForm( ).getExit( ), comentarios ) ;
			}catch( Exception e )
			{
                            MasterCardDAO.closeEntityManager( ) ;
				e.printStackTrace( ) ;
				return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_RELOAD , e.getMessage( ) , e ) ;
			}
			
			System.out.println( "PreimplementationAutorizaMaterialesFormProcess.java: resultado/" + stepupResult ) ;
			
                        MasterCardDAO.closeEntityManager( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_SUCCESS , stepupResult ) ;
			
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_RELOAD , e.getMessage( ) , e ) ;
		}
	}
    
}
